/**
 * Copyright (c) 2009 blurredVision
 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
 * associated documentation files (the "Software"), to deal in the Software without restriction, 
 * including without limitation the rights to use, copy, modify, merge, publish, distribute, 
 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is 
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all copies or 
 * substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT 
 * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, 
 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT 
 * OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */
#ifndef __PARTICLE_H__
#define __PARTICLE_H__

#pragma once

#include "geom/Vector.h"

namespace particlesystem {

enum eParticleState {
	PARTICLE_ALIVE = 0,
	PARTICLE_DYING,
	PARTICLE_DEAD
};

class IEmitter;
/**
 * \ingroup CoreEngine
 *
 * \date 04-11-2007
 *
 * \author juckel
 *
 */
class Particle
{
public:
	Particle();
	virtual ~Particle(void);

	/// Initialize the particle
	void create(IEmitter *emitter);

	/// Update the particle states
	bool update(float dt);

	/// Get the state of a particle
	const int getState() const;

	struct sData {
		math::Vector3 vPosition;
		math::Vector4 vColor;
		float         fSize;
		float         fPartTime;
		math::Vector3 vInitPosition;
	} m_sData;

	math::Vector3 m_vVelocity;			///< The current velocity of the particle
	int           m_iState;				///< The state of the particle: 0 = alive, 1 = dying, 2 = dead
	float         m_fCamDist;			///< The distance from the camera

	IEmitter*     pEmitter;
};

}  // namespace

#endif
